home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / game / role / angband.lha / angband / src / staffs.c < prev    next >
C/C++ Source or Header  |  1993-05-08  |  6KB  |  263 lines

  1. /* staffs.c: staff code
  2.  
  3.    Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
  4.  
  5.    This software may be copied and distributed for educational, research, and
  6.    not for profit purposes provided that this copyright and statement are
  7.    included in all such copies. */
  8.  
  9. #include "constant.h"
  10. #include "monster.h"
  11. #include "config.h"
  12. #include "types.h"
  13. #include "externs.h"
  14.  
  15. #ifdef USG
  16. #include <string.h>
  17. #else
  18. #include <strings.h>
  19. #endif
  20.  
  21.  
  22. /* Use a staff.                    -RAK-    */
  23. void use()
  24. {
  25.   int32u i;
  26.   int j, k, item_val, chance, y, x;
  27.   register int ident;
  28.   register struct misc *m_ptr;
  29.   register inven_type *i_ptr;
  30.  
  31.   free_turn_flag = TRUE;
  32.   if (inven_ctr == 0)
  33.     msg_print("But you are not carrying anything.");
  34.   else if (!find_range(TV_STAFF, TV_NEVER, &j, &k))
  35.     msg_print("You are not carrying any staffs.");
  36.   else if (get_item(&item_val, "Use which staff?", j, k, 0))
  37.     {
  38.       i_ptr = &inventory[item_val];
  39.       free_turn_flag = FALSE;
  40.       m_ptr = &py.misc;
  41.       chance = m_ptr->save + stat_adj(A_INT) - (int)i_ptr->level - 5
  42.     + (class_level_adj[m_ptr->pclass][CLA_DEVICE] * m_ptr->lev / 3);
  43.       if (py.flags.confused > 0)
  44.     chance = chance / 2;
  45.       if (chance <= 0)    chance = 1;
  46.       if (randint(chance) < USE_DEVICE)
  47.     msg_print("You failed to use the staff properly.");
  48.       else if (i_ptr->p1 > 0)
  49.     {
  50.       i = i_ptr->flags;
  51.       ident = FALSE;
  52.       (i_ptr->p1)--;
  53.       switch(i) {
  54.       case ST_HEALING:
  55.         ident = hp_player(300);
  56.         if (py.flags.stun>0) {
  57.           if (py.flags.stun>50) {
  58.         py.misc.ptohit+=20;
  59.         py.misc.ptodam+=20;
  60.           } else {
  61.         py.misc.ptohit+=5;
  62.         py.misc.ptodam+=5;
  63.           }
  64.           py.flags.stun=0;
  65.           ident = TRUE;
  66.           msg_print("You're head stops stinging.");
  67.         }
  68.         if (py.flags.cut>0) {
  69.           py.flags.cut=0;
  70.           ident = TRUE;
  71.           msg_print("You feel better.");
  72.         }
  73.         break;
  74.       case ST_GENOCIDE:
  75.         genocide(FALSE);
  76.         ident = TRUE;
  77.         break;
  78.       case ST_PROBE:
  79.         probing();
  80.         ident = TRUE;
  81.         break;
  82.           case ST_IDENTIFY:
  83.         ident_spell();
  84.         ident = TRUE;
  85.         break;
  86.       case ST_HOLYNESS:
  87.         dispel_creature(EVIL,120);
  88.         protect_evil();
  89.         cure_poison();
  90.         remove_fear();
  91.         hp_player(50);
  92.         if (py.flags.stun>0) {
  93.           if (py.flags.stun>50) {
  94.         py.misc.ptohit+=20;
  95.         py.misc.ptodam+=20;
  96.           } else {
  97.         py.misc.ptohit+=5;
  98.         py.misc.ptodam+=5;
  99.           }
  100.           py.flags.stun=0;
  101.           ident = TRUE;
  102.           msg_print("You're head stops stinging.");
  103.         }
  104.         if (py.flags.cut>0) {
  105.           py.flags.cut=0;
  106.           ident = TRUE;
  107.           msg_print("You feel better.");
  108.         }
  109.         ident = TRUE;
  110.         break;
  111.       case ST_MAGI:
  112.             if (res_stat(A_INT)) {
  113.            msg_print("You have a warm feeling.");
  114.            ident = TRUE;
  115.         }
  116.         m_ptr = &py.misc;
  117.         if (m_ptr->cmana < m_ptr->mana) {
  118.           m_ptr->cmana = m_ptr->mana;
  119.           ident = TRUE;
  120.               msg_print("Your feel your head clear.");
  121.           prt_cmana();
  122.         }
  123.         break;
  124.       case ST_POWER:
  125.         dispel_creature(0xFFFFFFFFL,120);
  126.             break;
  127.       case ST_SURROUND:
  128.         map_area();
  129.         ident = TRUE;
  130.         break;
  131.           case ST_LIGHT:
  132.         ident = light_area(char_row, char_col);
  133.         break;
  134.       case ST_DR_LC:
  135.         ident = detect_sdoor();
  136.         break;
  137.       case ST_TRP_LC:
  138.         ident = detect_trap();
  139.         break;
  140.       case ST_TRE_LC:
  141.         ident = detect_treasure();
  142.         break;
  143.       case ST_OBJ_LC:
  144.         ident = detect_object();
  145.         break;
  146.           case ST_TELE:
  147.         teleport(100);
  148.         ident = TRUE;
  149.         break;
  150.       case ST_EARTH:
  151.         ident = TRUE;
  152.         earthquake();
  153.         break;
  154.           case ST_SUMMON:
  155.         ident = FALSE;
  156.         for (k = 0; k < randint(4); k++)
  157.         {
  158.           y = char_row;
  159.           x = char_col;
  160.           ident |= summon_monster(&y, &x, FALSE);
  161.         }
  162.         break;
  163.       case ST_DEST:
  164.         ident = TRUE;
  165.         destroy_area(char_row, char_col);
  166.             break;
  167.       case ST_STAR:
  168.         ident = TRUE;
  169.         starlite(char_row, char_col);
  170.         break;
  171.       case ST_HAST_MN:
  172.         ident = speed_monsters(1);
  173.         break;
  174.       case ST_SLOW_MN:
  175.         ident = speed_monsters(-1);
  176.         break;
  177.       case ST_SLEE_MN:
  178.         ident = sleep_monsters2();
  179.         break;
  180.       case ST_CURE_LT:
  181.         ident = hp_player(randint(8));
  182.         break;
  183.       case ST_DET_INV:
  184.         ident = detect_invisible();
  185.         break;
  186.           case ST_SPEED:
  187.         if (py.flags.fast == 0) ident = TRUE;
  188.         if (py.flags.fast <= 0)
  189.           py.flags.fast += randint(30) + 15;
  190.         else
  191.           py.flags.fast += randint(5);
  192.         break;
  193.           case ST_SLOW:
  194.         if (py.flags.slow == 0) ident = TRUE;
  195.         py.flags.slow += randint(30) + 15;
  196.         break;
  197.       case ST_REMOVE:
  198.         if (remove_curse())
  199.         {
  200.           if (py.flags.blind < 1)
  201.             msg_print("The staff glows blue for a moment..");
  202.           ident = TRUE;
  203.         }
  204.         break;
  205.       case ST_DET_EVI:
  206.         ident = detect_evil();
  207.             break;
  208.       case ST_CURING:
  209.         if ((cure_blindness()) || (cure_poison()) ||
  210.         (cure_confusion()) || (py.flags.stun>0) || (py.flags.cut>0))
  211.           ident = TRUE;
  212.         if (py.flags.stun>0) {
  213.           if (py.flags.stun>50) {
  214.         py.misc.ptohit+=20;
  215.         py.misc.ptodam+=20;
  216.           } else {
  217.         py.misc.ptohit+=5;
  218.         py.misc.ptodam+=5;
  219.           }
  220.           py.flags.stun=0;
  221.           msg_print("You're head stops stinging.");
  222.         } else if (py.flags.cut>0) {
  223.           py.flags.cut=0;
  224.           msg_print("You feel better.");
  225.         }
  226.         break;
  227.       case ST_DSP_EVI:
  228.         ident = dispel_creature(EVIL, 60);
  229.             break;
  230.       case ST_DARK:
  231.         ident = unlight_area(char_row, char_col);
  232.             break;
  233.       default:
  234.         msg_print("Internal error in staffs()");
  235.         break;
  236.       }
  237.       if (ident)
  238.         {
  239.           if (!known1_p(i_ptr))
  240.         {
  241.           m_ptr = &py.misc;
  242.           /* round half-way case up */
  243.           m_ptr->exp += (i_ptr->level + (m_ptr->lev >> 1)) /
  244.             m_ptr->lev;
  245.           prt_experience();
  246.  
  247.           identify(&item_val);
  248.           i_ptr = &inventory[item_val];
  249.         }
  250.         }
  251.       else if (!known1_p(i_ptr))
  252.         sample (i_ptr);
  253.       desc_charges(item_val);
  254.     }
  255.       else
  256.     {
  257.       msg_print("The staff has no charges left.");
  258.       if (!known2_p(i_ptr))
  259.         add_inscribe(i_ptr, ID_EMPTY);
  260.     }
  261.     }
  262. }
  263.